#define START_VAL_NUM 16

// We have to define operator= for arr[2],arr[3],arr[4] in order 
// to enable template use.

int is_pow2(int n){
	if(n<=0) return 0;
	int t=n,acc=0;
	while(t>0) {
		if(t & 1) acc++;
		t>>=1;
	}
	return acc==1;
};

template <class M,class S>
void add_scalar(M m,S s){
	if(m->values==NULL && m->numValues<=0) {
		m->values=new S[START_VAL_NUM];
		m->numValues=0;
	} else if(m->numValues>=START_VAL_NUM && is_pow2(m->numValues)){
		S* tmp=m->values;
		m->values=new S[m->numValues*2];
		for(unsigned int i=0;i<m->numValues;i++) m->values[i]=tmp[i];
		delete tmp;
	}
	m->values[m->numValues]=s;
	m->numValues++;
};

void add_array(VRMFVec2f* m,VRSFVec2f s){
	if(m->values==NULL && m->numValues<=0) {
		m->values=new VRSFVec2f[START_VAL_NUM];
		m->numValues=0;
	} else if(m->numValues>=START_VAL_NUM && is_pow2(m->numValues)){
		VRSFVec2f* tmp=m->values;
		m->values=new VRSFVec2f[m->numValues*2];
		for(unsigned int i=0;i<m->numValues;i++) {
			m->values[i][0]=tmp[i][0];
			m->values[i][1]=tmp[i][1];
		}
		delete[] tmp;
	}
	m->values[m->numValues][0]=s[0];
	m->values[m->numValues][1]=s[1];
	m->numValues++;
};



void add_array(VRMFVec3f* m,VRSFVec3f s){
	if(m->values==NULL && m->numValues<=0) {
		m->values=new VRSFVec3f[START_VAL_NUM];
		m->numValues=0;
	} else if(m->numValues>=START_VAL_NUM && is_pow2(m->numValues)){
		VRSFVec3f* tmp=m->values;
		m->values=new VRSFVec3f[m->numValues*2];
		for(unsigned int i=0;i<m->numValues;i++) {
			m->values[i][0]=tmp[i][0];
			m->values[i][1]=tmp[i][1];
			m->values[i][2]=tmp[i][2];
		}
		delete[] tmp;
	}
	m->values[m->numValues][0]=s[0];
	m->values[m->numValues][1]=s[1];
	m->values[m->numValues][2]=s[2];
	m->numValues++;
};



void add_array(VRMFRotation* m, VRSFRotation s){
	if(m->values==NULL && m->numValues<=0) {
		m->values=new VRSFRotation[START_VAL_NUM];
		m->numValues=0;
	} else if(m->numValues>=START_VAL_NUM && is_pow2(m->numValues)){
		VRSFRotation* tmp=m->values;
		m->values=new VRSFRotation[m->numValues*2];
		for(unsigned int i=0; i<m->numValues; i++) {
			m->values[i][0]=tmp[i][0];
			m->values[i][1]=tmp[i][1];
			m->values[i][2]=tmp[i][2];
			m->values[i][3]=tmp[i][3];
		}
		delete[] tmp;
	}
	m->values[m->numValues][0]=s[0];
	m->values[m->numValues][1]=s[1];
	m->values[m->numValues][2]=s[2];
	m->values[m->numValues][3]=s[3];
	m->numValues++;
};